from sys import argv
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

class MyPyOpenGLTest:
    def __init__(self, width=640, height=480,
                 title='PyOpenGL立方体透视投影'.encode('gbk')):
        glutInit(argv)
        glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
        # 设置图形窗口初始大小和位置，然后创建图形窗口，顺序不能变
        glutInitWindowSize(width, height)
        glutInitWindowPosition(400, 200)
        glutCreateWindow(title)
        glutDisplayFunc(self.draw)
        glutReshapeFunc(self.reshape)
        glutIdleFunc(self.draw)
        self.InitGL(width, height)

    def InitGL(self, width, height):
        # 初始化窗口背景为白色
        glClearColor(1.0, 1.0, 1.0, 1.0)
        # 前三个参数设置相机或眼睛在世界坐标系中的位置
        # 中间三个参数设置眼睛注视的点在世界坐标系中的位置
        # 最后三个参数设置相机正上方的向量
        # 调整参数观察不同角度的视觉效果
        gluLookAt(5, 5, 5, 0, 0, 0, 0, 1, 0)
        glMatrixMode(GL_MODELVIEW)
        glScalef(3, 3, 3)
        glRotatef(45, 0, 1, 1)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        glFrustum(-1, 1, -1, 1, 1, 20)

    def reshape(self, w, h):
        glViewport(0, 0, w, h)

    def draw(self):
        # 每次绘制图形之前清除颜色缓冲区和深度缓冲区中的信息
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glColor3f(0,1,0)
        glutSolidCube(1)
        glColor3f(0,0,1)
        glLineWidth(2)
        glutWireCube(1)

        # 交换缓冲区，更新图形
        glutSwapBuffers()

    # 消息主循环
    def mainloop(self):
        glutMainLoop()

if __name__ == '__main__':
    # 创建窗口对象，启动消息主循环
    MyPyOpenGLTest().mainloop()
